import java.util.HashSet;
import java.util.Set;

public class code3 {
//    力扣 150 快乐数
public boolean isHappy(int n) {
    // 这里要注意时间复杂度的情况
    // 为了可以更高效率的查找到 通过运算法则计算后的值，这里需要使用到 Set
    Set<Integer> s = new HashSet<>();

    // 这里需要设置一个 while 循环，
    // 如果在计算过程中出现了重复值的情况，就说明这不是快乐数，此时正在进行死循环
    // 这就需要返回 false
    while(n != 1 && !s.contains(n)) {
        s.add(n);
        // 更新 n 的值
        n = getNum(n);
    }

    // 在上面的条件中
    // 返回的结果无非就是 n 是否为 1
    // 如果计算到最后 n 为 1 呢就是返回 ture
    // 如果 是在 set 中找到了重复计算的值，呢么就是 false;
    return n == 1;
}

    // 这里创建出一个方法，主要用来实现计算将数字分开后进行乘方的操作
    private int getNum(int n) {
        int re = 0;
        while(n > 0) {
            // 取出个位上的数字
            int a = n % 10;
            // 将数字分割
            n = n/10;
            // 计算单个数字的平方并且进行加和
            re += a * a;
        }
        // 将计算得到的值返回回去
        return re;
    }
}
